package org.example.ba01;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;

import java.util.Date;

/*@Aspect :  该注解是aspect中的注解，表示该类是切面类
*           切面类：用来给目标方法增加功能的类，在该类中有切面代码*/
@Aspect
public class MyAspect {
    /*@Before(value = "execution(public void org.example.ba01.impl.SomeServiceImpl.doSome(String,Integer))")
    public void MyBefore(){
        System.out.println(new Date());
    }*/

    /*@Before(value = "execution(void org.example.ba01.impl.SomeServiceImpl.doSome(String,Integer))")
    public void MyBefore(){
        System.out.println(new Date());
    }*/

    /*@Before(value = "execution(void *..SomeServiceImpl.doSome(String,Integer))")
    public void MyBefore(){
        System.out.println(new Date());
    }*/

    @Before(value = "execution(* *..SomeService.doSome(..))")
    public void MyBefore(JoinPoint jp){
        System.out.println("方法签名："+jp.getSignature());
        System.out.println("方法名："+jp.getSignature().getName());
        Object objects[] = jp.getArgs();
        for(Object o:objects){
            System.out.println(o);
        }
        System.out.println(new Date());
    }

    /*增强接口类  也可以

    如果不匹配执行的仍然是原来目标类的方法*/

    /*通知方法是无返回值的
    * 通知方法中的参数：
        * JoinPoint: 业务方法
        * 可以在通知方法中获取 方法执行时的信息 例如方法名
        * 参数的值由框架赋予*/
}
